package cn.edu.njnu.opengmpback.collaboration.enums;

import lombok.Getter;

/**
 * 协作项目隐私级别枚举
 * 基于原协作系统的三级隐私控制机制设计
 * 控制项目的可见性和访问权限
 */
@Getter
public enum ProjectPrivacy {
    
    /**
     * 公开项目
     * 所有用户可见，可申请加入
     */
    PUBLIC("public", "公开", 1, "所有用户可见，可申请加入"),
    
    /**
     * 受限项目
     * 仅特定用户可见，需要邀请才能加入
     */
    RESTRICTED("restricted", "受限", 2, "仅特定用户可见，需要邀请加入"),
    
    /**
     * 私有项目
     * 仅项目成员可见，严格邀请制
     */
    PRIVATE("private", "私有", 3, "仅项目成员可见，严格邀请制");
    
    /**
     * 隐私级别代码
     */
    private final String code;
    
    /**
     * 中文显示名称
     */
    private final String displayName;
    
    /**
     * 隐私级别（数字越大越严格）
     */
    private final int level;
    
    /**
     * 隐私描述
     */
    private final String description;
    
    ProjectPrivacy(String code, String displayName, int level, String description) {
        this.code = code;
        this.displayName = displayName;
        this.level = level;
        this.description = description;
    }
    
    /**
     * 根据代码获取隐私级别枚举
     * 
     * @param code 隐私级别代码
     * @return 对应的隐私级别枚举，如果不存在则返回PUBLIC
     */
    public static ProjectPrivacy fromCode(String code) {
        if (code == null) {
            return PUBLIC; // 默认为公开
        }
        
        for (ProjectPrivacy privacy : ProjectPrivacy.values()) {
            if (privacy.getCode().equals(code)) {
                return privacy;
            }
        }
        
        return PUBLIC; // 默认为公开
    }
    
    /**
     * 检查是否为公开项目
     * 
     * @return true 如果是公开项目
     */
    public boolean isPublic() {
        return this == PUBLIC;
    }
    
    /**
     * 检查是否为受限项目
     * 
     * @return true 如果是受限项目
     */
    public boolean isRestricted() {
        return this == RESTRICTED;
    }
    
    /**
     * 检查是否为私有项目
     * 
     * @return true 如果是私有项目
     */
    public boolean isPrivate() {
        return this == PRIVATE;
    }
    
    /**
     * 检查指定用户是否可以查看该隐私级别的项目
     * 
     * @param userId 用户ID
     * @param isMember 是否为项目成员
     * @param isCreator 是否为项目创建者
     * @return true 如果用户可以查看项目
     */
    public boolean canView(String userId, boolean isMember, boolean isCreator) {
        // 创建者和成员总是可以查看
        if (isCreator || isMember) {
            return true;
        }
        
        // 根据隐私级别判断
        switch (this) {
            case PUBLIC:
                return true; // 公开项目所有人可见
            case RESTRICTED:
            case PRIVATE:
                return false; // 受限和私有项目只有成员可见
            default:
                return false;
        }
    }
    
    /**
     * 检查指定用户是否可以申请加入该隐私级别的项目
     * 
     * @param userId 用户ID
     * @return true 如果用户可以申请加入
     */
    public boolean canApplyToJoin(String userId) {
        switch (this) {
            case PUBLIC:
                return true; // 公开项目可以申请加入
            case RESTRICTED:
            case PRIVATE:
                return false; // 受限和私有项目只能通过邀请加入
            default:
                return false;
        }
    }
}